/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package engine.linkList;
import java.io.Serializable;

/**
 *
 * @author hjp
 */

//双向链表
/*
设计理念：
在底层的Node上使用泛型类来进行设计，是因为：
播放器主要管理2个链表，一个是音乐链表，一个是歌单链表；
我们想要为这两个链表提供统一的功能实现：增加，删除等
而增加删除结点都是在构成各个链表的结点层次上来操作的，同时，构成音乐链表的结点是MusicNode，
构成歌单链表的结点是ListNode，它们并非同一种类型，故为了提供统一的功能，我们就应该使用泛型类。
最开始我们想，应该使用一个抽象类abstractNode，在这个类中提供统一的方法实现，然让MusicNode和ListNode继承它，
但是这样，在编写add方法等的时候，由于要操纵引用，这就出现了类型不匹配的问题。故不能使用抽象父类来实现这一想法。
 */
public class Node<T extends AbstractNode> implements Serializable {
    public Node<T> next;
    public Node<T> pre;
    public T info;

    Node(T info){
        next = pre = null;
        this.info = info;
    }

    @Override
    public String toString(){
        return info.toString();
    }

    void addPre(Node<T> node){
        Node<T> pNode = this.pre;
        if (pNode != null){
            pNode.next = node;
            node.next = this;
            node.pre = pNode;
            this.pre = node;
        }
        else {
            node.next = this;
            this.pre = node;
            node.pre = null;
        }
    }

    void addNext(Node<T> node){
        Node<T> pNode = this.next;
        if (pNode != null){
            this.next = node;
            node.next = pNode;
            node.pre = this;
            pNode.pre = node;
        }
        else {
            this.next = node;
            node.pre = this;
            node.next = null;
        }
    }

    void delete(){
        Node<T> preNode = this.pre;
        Node<T> nextNode = this.next;
        if (preNode != null && nextNode != null){
            preNode.next = nextNode;
            nextNode.pre = preNode;
            this.next = this.pre = null;
            //析构
        }
        else if (preNode == null && nextNode == null){
            this.info = null;
            //析构
            return;
        }
        else if (preNode == null){
            nextNode.pre = null;
            this.next = null;
            //析构
        }
        else {
            preNode.next = null;
            this.pre = null;
            //析构
        }
        this.info = null;
    }
}
